package com.xinwangai.jingbai.pojo.VO;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

import java.util.Date;
import java.util.List;
import java.util.ArrayList;

/**
 * 打卡活动实体类
 * 用于返回给前端的数据
 *
 * @author guo.wenliang
 * @since 2025/8/13 18:02
 */
@Data
public class CheckinActivity {
    private Long id;
    private String title;
    private String description;
    private Integer checkinFrequency; // 打卡频率：每几天打卡一次（1=每天，2=每2天，7=每周等）
    private Date startDate;
    private Date endDate;
    private Integer targetDays; // 目标天数
    private Integer completedDays; // 已完成天数
    private Integer status; // 0-待开始，1-进行中，2-已完成，3-暂停
    private Long createdBy;
    private String createdByName; // 创建人姓名（通过JOIN查询获得）
    private Date createTime;
    private Date updateTime;
    
    // 参与人员，MySQL中存储为JSON字符串
    @JsonIgnore
    private String participants;
    
    // 扩展字段，用于前端显示
    private Integer totalParticipants; // 总参与人数
    @JsonIgnore
    private List<String> participantList; // 参与者列表（从JSON解析）
    
    /**
     * 用于JSON序列化的participants字段（返回解析后的数组）
     */
    @JsonProperty("participants")
    public List<String> getParticipantsForJson() {
        if (participants == null || participants.trim().isEmpty()) {
            return new ArrayList<>();
        }
        
        try {
            return objectMapper.readValue(participants, new TypeReference<List<String>>() {});
        } catch (Exception e) {
            return new ArrayList<>();
        }
    }
    
    // JSON转换器
    private static final ObjectMapper objectMapper = new ObjectMapper();
    
    /**
     * 获取参与者列表（自动从JSON字符串解析）
     */
    public List<String> getParticipantList() {
        if (participantList != null) {
            return participantList;
        }
        
        if (participants == null || participants.trim().isEmpty()) {
            participantList = new ArrayList<>();
            return participantList;
        }
        
        try {
            participantList = objectMapper.readValue(participants, new TypeReference<List<String>>() {});
        } catch (Exception e) {
            participantList = new ArrayList<>();
        }
        
        return participantList;
    }
    
    /**
     * 设置参与者列表（自动转换为JSON字符串）
     */
    public void setParticipantList(List<String> participantList) {
        this.participantList = participantList;
        try {
            this.participants = objectMapper.writeValueAsString(participantList);
        } catch (Exception e) {
            this.participants = "[]";
        }
    }
}
